package com.cykj.eurekaribbon.utils;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.SocketException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

public class FtpTool {
    // ftp服务器ip地址
    private static final String FTP_ADDRESS = "120.77.43.188";

    // 端口号
    private static final  Integer FTP_PORT = 21;

    // 用户名
    private static final  String FTP_USER_NAME = "vsftpd";

    // 密码
    private static  final  String FTP_PASSWORD = "vsftpd";

    // 文件保存的根路径
    private static final  String FTP_PATH = "/var/public_root/";

    /**
     * 利用ftp上传图片至服务器上
     */
    public static Boolean uploadFile(String fileName,InputStream inputStream){
        Boolean success = false;

        File file = new File("C:\\Users\\Administrator\\Pictures\\Camera Roll\\WIN_20210907_16_05_28_Pro.jpg");

        fileName = getFileName(file.getName());

        String filePath = "image_files/";

        FTPClient ftpClient = new FTPClient();
        ftpClient.enterLocalPassiveMode();// 设置允许被动连接，访问远程ftp时需要
        try{
            //连接到FTP 服务器
            ftpClient.connect(FTP_ADDRESS,FTP_PORT);
            Boolean bool = ftpClient.login(FTP_USER_NAME,FTP_PASSWORD);
            if (bool){
                System.out.println("连接成功");
            }else {
                System.out.println("连接失败");
            }

            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);// 设置二进制的文件类型
//            Date currentDate = new Date();
//            String dateStr=new SimpleDateFormat("yyyy/MM/dd").format(currentDate);
//            System.out.println("保存文件时间："+dateStr);
            String path = FTP_PATH+filePath;
//            for(String pathStr:filePath.split("/")){
//                path += pathStr+"/";
                boolean flag = ftpClient.changeWorkingDirectory(path);
                System.out.println(flag+" 文件是否存在");
                if(!flag){
                    //创建上传的路径  该方法只能创建一级目录
                    ftpClient.makeDirectory(path);
                }
//            }
            System.out.println(path);
            //指定上传路径
            ftpClient.changeWorkingDirectory(path);
            //ftp上传文件是以文本形式传输的，所以多媒体文件会失真，需要转为二进制形式传输
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
            if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
                // 连接失败，进行断开连接
                ftpClient.disconnect();
                System.out.println("连接失败了");
                return false;
            }
            long start = System.currentTimeMillis();
            //转码后可以文件名可以为中文ftpClient.storeFile(new String(fileNewName.getBytes("GBK"), "iso-8859-1"), inputStream);
            boolean fig = ftpClient.storeFile(fileName, new FileInputStream(file));
            if(fig){
                long end = System.currentTimeMillis();
                System.out.println(String.format("文件:%s上传成功,耗时：%d毫秒",fileName,(end-start)));
                return true;
            }else {
                System.out.println("上传失败");
                return  false;
            }
        }catch (IOException e){
            e.printStackTrace();
            System.out.println("保存图片到文件服务器ERROR: "+e.getMessage());
            return  false;
        } finally {
            //关闭资源
            try {
                if(null != inputStream){
                    inputStream.close();
                }
                //退出
                ftpClient.logout();
                //断开连接
                ftpClient.disconnect();
            }catch (IOException e){
                System.out.println("保存图片到文件服务器关闭资源ERROR: "+e.getMessage());
            }
        }

    }

    //生成上传文件的名称
    public static String getFileName(String primitiveFileName){
        //使用uuid生成文件名
        String fileName=UUID.randomUUID().toString();
        //获取文件后缀
        String suffix=primitiveFileName.substring(primitiveFileName.lastIndexOf("."));
        return fileName+suffix;
    }
}
